/**
 * 加密工具类
 * 提供Base64等加密功能
 */

/**
 * Base64编码
 * @param {String} str 要编码的字符串
 * @returns {String} Base64编码后的字符串
 */
export function base64Encode(str) {
	if (!str) return '';
	
	try {
		// 在uni-app中使用内置的Base64编码
		// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ
		return wx.arrayBufferToBase64(new TextEncoder().encode(str));
		// #endif
		
		// #ifdef H5 || APP-PLUS
		return btoa(unescape(encodeURIComponent(str)));
		// #endif
		
		// 其他平台使用手动实现
		return manualBase64Encode(str);
	} catch (error) {
		console.error('Base64编码失败:', error);
		// 降级到手动实现
		return manualBase64Encode(str);
	}
}

/**
 * Base64解码
 * @param {String} base64Str Base64编码的字符串
 * @returns {String} 解码后的字符串
 */
export function base64Decode(base64Str) {
	if (!base64Str) return '';
	
	try {
		// 在uni-app中使用内置的Base64解码
		// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ
		const buffer = wx.base64ToArrayBuffer(base64Str);
		return new TextDecoder().decode(buffer);
		// #endif
		
		// #ifdef H5 || APP-PLUS
		return decodeURIComponent(escape(atob(base64Str)));
		// #endif
		
		// 其他平台使用手动实现
		return manualBase64Decode(base64Str);
	} catch (error) {
		console.error('Base64解码失败:', error);
		return '';
	}
}

/**
 * 手动实现Base64编码（兼容性方案）
 * @param {String} str 要编码的字符串
 * @returns {String} Base64编码后的字符串
 */
function manualBase64Encode(str) {
	const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
	let result = '';
	let i = 0;
	
	// 将字符串转换为UTF-8字节数组
	const utf8Bytes = [];
	for (let j = 0; j < str.length; j++) {
		const code = str.charCodeAt(j);
		if (code < 0x80) {
			utf8Bytes.push(code);
		} else if (code < 0x800) {
			utf8Bytes.push(0xC0 | (code >> 6));
			utf8Bytes.push(0x80 | (code & 0x3F));
		} else {
			utf8Bytes.push(0xE0 | (code >> 12));
			utf8Bytes.push(0x80 | ((code >> 6) & 0x3F));
			utf8Bytes.push(0x80 | (code & 0x3F));
		}
	}
	
	// Base64编码
	while (i < utf8Bytes.length) {
		const a = utf8Bytes[i++];
		const b = i < utf8Bytes.length ? utf8Bytes[i++] : 0;
		const c = i < utf8Bytes.length ? utf8Bytes[i++] : 0;
		
		const bitmap = (a << 16) | (b << 8) | c;
		
		result += chars.charAt((bitmap >> 18) & 63);
		result += chars.charAt((bitmap >> 12) & 63);
		result += i - 2 < utf8Bytes.length ? chars.charAt((bitmap >> 6) & 63) : '=';
		result += i - 1 < utf8Bytes.length ? chars.charAt(bitmap & 63) : '=';
	}
	
	return result;
}

/**
 * 手动实现Base64解码（兼容性方案）
 * @param {String} base64Str Base64编码的字符串
 * @returns {String} 解码后的字符串
 */
function manualBase64Decode(base64Str) {
	const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
	let result = '';
	let i = 0;
	
	// 移除非Base64字符
	base64Str = base64Str.replace(/[^A-Za-z0-9+/]/g, '');
	
	while (i < base64Str.length) {
		const encoded1 = chars.indexOf(base64Str.charAt(i++));
		const encoded2 = chars.indexOf(base64Str.charAt(i++));
		const encoded3 = chars.indexOf(base64Str.charAt(i++));
		const encoded4 = chars.indexOf(base64Str.charAt(i++));
		
		const bitmap = (encoded1 << 18) | (encoded2 << 12) | (encoded3 << 6) | encoded4;
		
		result += String.fromCharCode((bitmap >> 16) & 255);
		if (encoded3 !== 64) result += String.fromCharCode((bitmap >> 8) & 255);
		if (encoded4 !== 64) result += String.fromCharCode(bitmap & 255);
	}
	
	return result;
}

/**
 * 密码加密（使用Base64）
 * @param {String} password 原始密码
 * @returns {String} Base64加密后的密码
 */
export function encryptPassword(password) {
	if (!password) return '';
	return base64Encode(password);
}

/**
 * 密码解密（Base64解码）
 * @param {String} encryptedPassword Base64加密的密码
 * @returns {String} 解密后的密码
 */
export function decryptPassword(encryptedPassword) {
	if (!encryptedPassword) return '';
	return base64Decode(encryptedPassword);
}

// 默认导出
export default {
	base64Encode,
	base64Decode,
	encryptPassword,
	decryptPassword
};
